#include "queuetask.h"


QueueHandle_t xEventQueue; // 事件队列句柄

/* 函数声明*/
void QueueTask_EventLoopTask(void* arg);

// 事件处理函数示例
void Event1Handler(void* arg) {
    // 事件1的处理逻辑
}

void Event2Handler(void* arg) {
    // 事件2的处理逻辑
}

// 后续执行函数示例
void PostEvent1Action(void* arg) {
    // 事件1后的行动
}

void PostEvent2Action(void* arg) {
    // 事件2后的行动
}

// 队列任务初始化
void QueueTask_Init(void) {

    // 创建事件队列
    xEventQueue = xQueueCreate(10, sizeof(QueueItem));
    if (xEventQueue == NULL) {
        // 队列创建失败处理
    }

    // 创建并启动事件循环任务
    if (xTaskCreate(QueueTask_EventLoopTask, "EventLoop", 1024, NULL, 2, NULL) != pdPASS) {
        // 任务创建失败处理
    }
}

// 发送事件到队列
void QueueTask_SendEvent(EventType eventType, EventFunction eventFunc, PostFunction postFunc, void* arg) {
    QueueItem item = {
        .eventType = eventType,
        .eventFunc = eventFunc,
        .postFunc = postFunc,
        .arg = arg
    };
    xQueueSend(queuetask.xEventQueue, &item, portMAX_DELAY);
}

// 事件循环任务
void QueueTask_EventLoopTask(void* arg) {
    QueueItem item;
	uint8_t rc = pdFALSE;
    while (1) {
        if (xQueueReceive(queuetask.xEventQueue, &item, portMAX_DELAY) == pdTRUE) {
			if(item.eventFunc != NULL) {
            	rc = item.eventFunc(rc, item.arg); // 执行事件处理函数
            }

            if (item.postFunc != NULL) {
                item.postFunc(rc, item.arg); // 如果存在后续执行函数，则执行
            }
        }
    }
}

// 设备模块实例化
QueueTaskModule queuetask = {
    // .xEventQueue = NULL,

    .Init = QueueTask_Init,
    .SendEvent = QueueTask_SendEvent,
    // .EventLoopTask = QueueTask_EventLoopTask
};


// 应用程序主函数或其他初始化代码中使用
int main(void) {
    // 初始化 FreeRTOS 系统
    // ...

    // 初始化队列任务模块
    queuetask.Init(&queuetask);

    // 创建并启动事件循环任务
    xTaskCreate(queuetask.EventLoopTask, "EventLoop", 1024, NULL, 2, NULL);

    // 启动调度器
    vTaskStartScheduler();

    // 主循环永远不会返回
    for (;;);
}